<?php
declare (strict_types = 1);

namespace app\api\model;

use think\Model;

/**
 * Admin 模型
 * 对应数据表：sys_admin
 */
class Admin extends Model
{
    // 设置数据表名（不含前缀）
    protected $name = 'sys_admin';
    
    // 设置主键
    protected $pk = 'id';
    
    // 自动时间戳
    protected $autoWriteTimestamp = true;
    
    // 定义时间戳字段名
    protected $createTime = 'create_time';
    protected $updateTime = 'update_time';
    
    // 隐藏字段（JSON 序列化时不显示）
    protected $hidden = ['password'];
    
    // 字段类型转换
    protected $type = [
        'id'          => 'integer',
        'role_id'     => 'integer',
        'is_active'   => 'integer',
        'create_time' => 'datetime',
        'update_time' => 'datetime',
    ];
    
    /**
     * 根据用户名查找用户
     * @param string $name
     * @return Admin|null
     */
    public static function findByName(string $name)
    {
        return self::where('name', $name)->find();
    }
    
    /**
     * 验证密码
     * @param string $password
     * @return bool
     */
    public function verifyPassword(string $password): bool
    {
        // 先尝试 password_verify（password_hash 加密）
        if (password_verify($password, $this->password)) {
            return true;
        }
        
        // 如果失败，再尝试 MD5 验证（兼容旧数据）
        if (strlen($this->password) === 32) {
            // 判断是否为 MD5 格式（32位十六进制）
            return md5($password) === $this->password;
        }
        
        return false;
    }
    
    /**
     * 设置密码（加密）
     * @param string $password
     * @return Admin
     */
    public function setPassword(string $password): self
    {
        $this->password = password_hash($password, PASSWORD_DEFAULT);
        return $this;
    }
    
    /**
     * 检查用户是否激活
     * @return bool
     */
    public function isActive(): bool
    {
        return $this->is_active === 1;
    }
    
    /**
     * 获取用户安全信息（不包含敏感数据）
     * @return array
     */
    public function getSafeInfo(): array
    {
        return [
            'id'          => $this->id,
            'name'        => $this->name,
            'remark'      => $this->remark,
            'headpic'     => $this->headpic,
            'role_id'     => $this->role_id,
            'is_active'   => $this->is_active,
            'create_time' => $this->create_time,
        ];
    }
    
    /**
     * 获取前端需要的用户信息格式
     * 前端期望的数据结构：
     * {
     *   userId: string,
     *   userName: string,
     *   roles: string[],
     *   buttons: string[]
     * }
     * @return array
     */
    public function getUserInfoForFrontend(): array
    {
        // 获取角色信息
        $roles = [];
        $buttons = [];
        
        if ($this->role_id) {
            $role = \app\api\model\Role::find($this->role_id);
            if ($role) {
                // 🔥 获取角色标识符（role_code）作为 roles 数组
                // 如果 role_code 为空，回退使用 name
                if (!empty($role->role_code)) {
                    $roles[] = $role->role_code;
                } else {
                    $roles[] = $role->name;
                }
                
                // 获取角色的菜单权限（role_list）作为 buttons 数组
                if (!empty($role->role_list)) {
                    $menuIds = explode(',', $role->role_list);
                    // 将菜单ID转换为字符串
                    $buttons = array_map('strval', array_filter($menuIds));
                }
            }
        }
        
        return [
            'userId'   => (string)$this->id,
            'userName' => (string)$this->name,
            'roles'    => $roles,
            'buttons'  => $buttons,
        ];
    }
}
